package teste;

import java.util.List;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import persistencia.PerfilDAO;
import persistencia.UsuarioDAO;
import entidades.Perfil;
import entidades.Usuario;


/**
 * Classe de Teste para a camada de Persistencia da Entidade Usuario.
 * 
 * @author Lino Bordin e Lucas Pessoa
 *
 */
public class TestPersistenciaUsuarioDao {
		
	private UsuarioDAO usuarioDao;
	private PerfilDAO perfilDao;

	
	Usuario user =  new Usuario();


	@Before
	public void setUp() throws Exception {
		
		criarDao();
		
	}
	
	/**
	 * Carregando o arquivo do Application Context.
	 */
	private void criarDao() {
		
		ApplicationContext context = new ClassPathXmlApplicationContext("/config/applicationContext.xml");
		usuarioDao = (UsuarioDAO) context.getBean("usuarioProxy");
		perfilDao = (PerfilDAO) context.getBean("perfilProxy");
			
	}
	
	//protected void tearDown() throws Exception {}
	
	@Test
	public void testShouldSaveUser() {
		
		criarDao();
		Usuario user =  new Usuario();
		user.setIdusuario(3);
		user.setNome("Test User");
		user.setSenha("password");
		user.setEmail("test@intacto.com.br");
		user.setEndereco("SQN 210 Bloco A Apartamento 202");
		user.setTelefone("2541-8582");
			
		usuarioDao.save(user);
		Assert.assertEquals(user.getIdUsuario(), usuarioDao.findUsuario("Test User").getIdUsuario());
		Assert.assertEquals(user.getNome(), usuarioDao.findUsuario("Test User").getNome());
		Assert.assertEquals(user.getSenha(), usuarioDao.findUsuario("Test User").getSenha());
		Assert.assertEquals(user.getEmail(), usuarioDao.findUsuario("Test User").getEmail());
		Assert.assertEquals(user.getEndereco(), usuarioDao.findUsuario("Test User").getEndereco());
		Assert.assertEquals(user.getTelefone(), usuarioDao.findUsuario("Test User").getTelefone());
		
	}
		
	@Test
	public void testShouldNotSaveNullUser() {
		
		criarDao();
		Usuario user =  null;
		usuarioDao.save(user);
		Assert.assertNull(usuarioDao.findUsuario(null));
		
	}
	
	@Test
	public void testShouldNotUpdateNullUser() {
		
		criarDao();
		Usuario user = null;
		usuarioDao.update(user);
		Assert.assertNull(usuarioDao.findUsuario(null));
		
	}
	
	@Test
	public void testShouldUpdateUser() {
		
		criarDao();
		Usuario user = new Usuario();
		
		user.setIdusuario(3);
		user.setNome("Test User2");
		user.setSenha("password");
		user.setEmail("test@intacto.com.br");
		user.setEndereco("SQN 210 Bloco A Apartamento 202");
		user.setTelefone("2541-8582");
		
		// ---- Atualiza os dados no banco ----
		usuarioDao.update(user);
		
		int idUsuario = usuarioDao.findUsuario("Test User2").getIdUsuario();
		String nomeUsuario = usuarioDao.findUsuario("Test User2").getNome();
		String senhaUsuario = usuarioDao.findUsuario("Test User2").getSenha();
		String emailUsuario = usuarioDao.findUsuario("Test User2").getEmail();
		String enderecoUsuario = usuarioDao.findUsuario("Test User2").getEndereco();
		String telefoneUsuario = usuarioDao.findUsuario("Test User2").getTelefone();
		
		// ---- Assertivas que verificam o comportamento do método ----
		Assert.assertEquals(3, idUsuario);
		Assert.assertEquals("Test User2", nomeUsuario);
		Assert.assertEquals("password", senhaUsuario);
		Assert.assertEquals("test@intacto.com.br", emailUsuario);
		Assert.assertEquals("SQN 210 Bloco A Apartamento 202", enderecoUsuario);
		Assert.assertEquals("2541-8582", telefoneUsuario);
		
	}
	
	@Test
	public void testShouldDeleteUser() {
		
		criarDao();
		usuarioDao.delete(3);
		//Assert.assertNotSame(expected, actual)
		
	}
	
	@Test
	public void testShouldListAllUsers() {
		
		criarDao();
		List<Usuario> lista = usuarioDao.listaTodosUsuarios();
		Assert.assertNotNull(lista);
		System.out.println("\nLista de usuários:");
		
		for (int i = 0; i < lista.size(); i++) {
			
			System.out.println("- " + lista.get(i).getNome());
			
		}
		
	}
	
	@Test
	public void testShouldShowInclusiveSearch() {
		
		criarDao();
		List<Perfil> listaPerfis = perfilDao.listAllProfiles();
		List<Usuario> listaUsuarios = usuarioDao.listUsersInclusive(listaPerfis);
		Assert.assertFalse(listaUsuarios.isEmpty());
	
	}
	
	@Test
	public void testShouldShowExclusiveSearch() {
		
		criarDao();
		List<Perfil> listaPerfis = perfilDao.listAllProfiles();
		List<Usuario> listaUsuarios = usuarioDao.listUsersExclusive(listaPerfis);
		Assert.assertFalse(listaUsuarios.isEmpty());
	
	}
	
}